// 房间缓存管理工具
// 统一管理房间相关的缓存数据结构

class RoomCache {
  /**
   * 保存房间信息到缓存
   * @param {Object} roomInfo - 房间信息对象
   * @param {Object} options - 选项
   */
  static saveRoom(roomInfo, options = {}) {
    const currentRoom = {
      roomCode: roomInfo.room_code,
      roomInfo: roomInfo,
      joinTime: new Date().getTime(),
      isNewRoom: options.isNewRoom || false
    }
    
    wx.setStorageSync('currentRoom', currentRoom)
    console.log('保存房间缓存:', currentRoom)
    return currentRoom
  }
  
  /**
   * 获取房间缓存
   * @returns {Object|null} 房间缓存对象或null
   */
  static getRoom() {
    try {
      const currentRoom = wx.getStorageSync('currentRoom')
      
      // 验证缓存数据完整性
      if (currentRoom && 
          currentRoom.roomCode && 
          currentRoom.roomInfo && 
          currentRoom.roomInfo.id) {
        return currentRoom
      }
      
      // 缓存数据无效，清除
      if (currentRoom) {
        console.log('房间缓存数据无效，清除缓存')
        this.clearRoom()
      }
      
      return null
    } catch (error) {
      console.error('获取房间缓存失败:', error)
      this.clearRoom()
      return null
    }
  }
  
  /**
   * 清除房间缓存
   */
  static clearRoom() {
    wx.removeStorageSync('currentRoom')
    wx.removeStorageSync('currentScore')
    console.log('清除房间缓存')
  }
  
  /**
   * 检查是否在房间中
   * @returns {boolean} 是否在房间中
   */
  static isInRoom() {
    const room = this.getRoom()
    return room !== null
  }
  
  /**
   * 获取房间基本信息（用于个人页面等）
   * @returns {Object|null} 房间基本信息或null
   */
  static getRoomBasicInfo() {
    const room = this.getRoom()
    if (!room) return null
    
    return {
      id: room.roomInfo.id,
      name: room.roomInfo.name,
      room_code: room.roomCode,
      player_count: room.roomInfo.users ? room.roomInfo.users.length : 0,
      owner_id: room.roomInfo.created_by || room.roomInfo.owner_id,
      is_settled: room.roomInfo.status === 'finished',
      joinTime: room.joinTime,
      isNewRoom: room.isNewRoom
    }
  }
  
  /**
   * 保存固定小程序码到缓存
   * @param {Object} qrcodeData - 小程序码数据
   */
  static saveUniversalQRCode(qrcodeData) {
    try {
      // 使用统一的key保存固定小程序码
      const qrcodeKey = 'universal_mini_program_code'
      const qrcodeInfo = {
        qrcode: qrcodeData,
        generatedAt: new Date().getTime()
      }
      
      wx.setStorageSync(qrcodeKey, qrcodeInfo)
      console.log('保存固定小程序码缓存:', qrcodeInfo)
      return true
    } catch (error) {
      console.error('保存固定小程序码失败:', error)
      return false
    }
  }
  
  /**
   * 获取固定小程序码
   * @returns {Object|null} 小程序码数据或null
   */
  static getUniversalQRCode() {
    try {
      const qrcodeKey = 'universal_mini_program_code'
      const qrcodeInfo = wx.getStorageSync(qrcodeKey)
      
      // 检查缓存是否有效（24小时内）
      if (qrcodeInfo && 
          qrcodeInfo.qrcode && 
          qrcodeInfo.generatedAt &&
          (new Date().getTime() - qrcodeInfo.generatedAt < 24 * 60 * 60 * 1000)) {
        return qrcodeInfo.qrcode
      }
      
      return null
    } catch (error) {
      console.error('获取固定小程序码失败:', error)
      return null
    }
  }
  
  /**
   * 更新房间信息
   * @param {Object} updates - 要更新的字段
   */
  static updateRoom(updates) {
    const room = this.getRoom()
    if (!room) return false
    
    // 更新房间信息
    if (updates.roomInfo) {
      room.roomInfo = { ...room.roomInfo, ...updates.roomInfo }
    }
    
    // 更新其他字段
    Object.keys(updates).forEach(key => {
      if (key !== 'roomInfo') {
        room[key] = updates[key]
      }
    })
    
    wx.setStorageSync('currentRoom', room)
    console.log('更新房间缓存:', room)
    return true
  }
  
  /**
   * 保存用户分数
   * @param {number} score - 分数
   */
  static saveScore(score) {
    wx.setStorageSync('currentScore', score)
  }
  
  /**
   * 获取用户分数
   * @returns {number} 分数
   */
  static getScore() {
    return wx.getStorageSync('currentScore') || 0
  }
  
  /**
   * 清除新房间标记
   */
  static clearNewRoomFlag() {
    const room = this.getRoom()
    if (room && room.isNewRoom) {
      room.isNewRoom = false
      wx.setStorageSync('currentRoom', room)
      console.log('清除新房间标记')
    }
  }
}

module.exports = RoomCache
